package com.wfs.suanfa.thread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

/**
 * @author: wfs
 * @Date: 2020/7/21 13:46
 * @Description:
 */
public class ThreadLocalTest {
   static   ThreadLocal<SimpleDateFormat> threadLocal_simpleDateFormat=new ThreadLocal<SimpleDateFormat>(){
       @Override
       protected SimpleDateFormat initialValue() {
           return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       }
   };
    static   SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


    public static void main(String[] args) {
        CountDownLatch countDownLatchTest=new CountDownLatch(10);
        for (  int i=0;i<10;i++){
            final int finalI = i;
            new Thread(new Runnable() {
                public void run() {
                    format(finalI);
                }
            }).start();

        }

    }
    public static  void format(int i){

        String threadlocal_format = threadLocal_simpleDateFormat.get().format(Long.valueOf(i*1000));
        String format = simpleDateFormat.format(Long.valueOf(i*1000));

        System.out.println("simpleDateFormat"+":"+format);
        System.err.println("threadlocal_format"+":"+threadlocal_format);
    }
}
class ThreadSafeDateFormatter {

    public static ThreadLocal<SimpleDateFormat> dateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };





    // 线性遍历，首先获取到指定下标的Entry对象，如果不为空，则进入到for循环体内，
    // 判断当前的ThreadLocal对象是否是同一个对象，如果是，那么直接进行值替换，并结束方法，
    // 如果不是，再判断当前Entry的key是否失效，如果失效，则直接将失效的key和值进行替换。
    // 这两点都不满足的话，那么就调用nextIndex方法进行搜寻下一个合适的位置，进行同样的操作，
    // 直到找到某个位置，内部数据为空，也就是Entry为null，那么就直接将键值对设置到这个位置上。
    // 最后判断是否达到了扩容的条件，如果达到了，那么就进行扩容。

}